查看原文
其他

ASP.NET Core 远程过程调用 gRPC使用

DotNet 2021-09-23

(给DotNet加星标,提升.Net技能


转自:WilsonPan
cnblogs.com/WilsonPan/p/12000796.html

前言


RPC是Remote Procedure Call简称,翻译过来是远程过程调用。它是一个进程间的通讯技术,基于Client-Server模式,让程序像调用本地方法一样使用,而无需去关系它细节如何实现。


上面是我的理解,怕理解有错或者表达不准确,下面引用维基百科


维基百科 a remote procedure call (RPC) is when a computer program causes a procedure (subroutine) to execute in a different address space (commonly on another computer on a shared network), which is coded as if it were a normal (local) procedure call, without the programmer explicitly coding the details for the remote interaction


网上找到一个图,比较形象描述RPC调用过程



什么时候需要RPC


RPC是解决进程间通讯(可以是同一个服务器,也可以是不同服务器的进程间,但是通常是内网的不同服务器之间进程通讯)。 


解决进程间通信,Web Api也是可以解决,为什么还需要RPC?我认为可以从下面几点


1、Web Api是基于HTTP,RPC可以是HTTP,也可以是TCP,甚至基于Socket,RPC框架通常都是隐藏通讯细节,让我们无感知使用


2、Web Api 通常基于JSON格式,XML格式,这种格式易读性强,但是随之带来就是传输过程需要把数据的元数据也带进去传输


3、Web Api更多应用场景是提供方定义好接口,由客户端按需调用,RPC通常需要调用方和提供方沟通一起定义接口


所以PRC更多是使用以下场景


  • 对通讯性能要求较高


  • 微服务


  • 点到点通讯


gRPC使用


 gRPC是Google开源的高性能RPC框架,有以下几个特点


  1. 现代高性能轻量级 RPC 框架。


  2. 协定优先 API 开发,默认使用protobuf,允许与语言无关的实现。(这里涉及两点,1.面向接口开发,依赖抽象而不是具体,2. 可以不同语言实现协作)


  3. 使用 Protobuf 二进制序列化减少对网络的使用。(减少网络传输)


  4. 可用于多种语言的工具,以生成强类型服务器和客户端。


  5. 支持客户端、服务器和双向流式处理调用。


下面开始介绍如何在.NET Core上使用gRPC。


一、安装dotnet-gRPC工具


(用于引用protobuf文件,生成客户端/服务端代码)


dotnet tool install dotnet-grpc -g


二、新建一个protobuf文件


syntax = "proto3";
option csharp_namespace = "gRPC.Services";
package sms;

// The greeting service definition.
service SmsSender {
// Sends a greeting
rpc SendSms (SmsRequest) returns (SmsResponse);
}

// The request message containing the user's name.
message SmsRequest {
string tel = 1;
string content = 2;
}

// The response message containing the greetings.
message SmsResponse {
int32 code = 1;
string message = 2;
}


三、新建一个服务端


1、新建一个gRPC工程


dotnet new grpc -n gRPC.Services


2、引入步骤二生成的protobuf文件(可以使用通配符引入多个protobuf文件)


dotnet-grpc add-file ..\gRPC.Protos\*.proto -s Serve


3、新建服务类


public class SmsService : SmsSender.SmsSenderBase
{
private readonly ILogger<SmsService> _logger;
public SmsService(ILogger<SmsService> logger)
{
_logger = logger;
}
public override Task<SmsResponse> SendSms(SmsRequest request, ServerCallContext context)
{
return Task.FromResult(new SmsResponse
{
Code = 1,
Message = "发送成功"
});
}
}


SmsSender 是生成工具生成的服务端代码


4、配置grpc服务类终结点


app.UseEndpoints(endpoints =>
{
endpoints.MapGrpcService<SmsService>();
});


四、新建客户端


1、新建控制台程序


dotnet new console -n gRPC.Client


2、添加包(Google.Protobuf)


dotnet add package Google.Protobuf


3、引入步骤二生成的protobuf文件(可以使用通配符引入多个protobuf文件),注意:这里需要生成是客户端代码,当然也可以用Both参数生成


dotnet-grpc add-file ..\gRPC.Protos\*.proto -s Client


五、运行


1、运行服务端


2、启动客户端


客户端输出下面信息


{"Code":1,"Message":"\u53D1\u9001\u6210\u529F"}


六、小结


gRPC的生命周期


Client(发送请求) -> Client stub(压缩/解压) -> Client RPC Transfer(发送/接收) -> Server RPC Transfer(接收/发送) -> Server stub(解压/压缩) -> Server (处理响应)


gPRC帮我们隐藏中间的环节,只剩下两头的代码(俗称业务逻辑代码)


protobuf它是一种可序列化的数据结构,但它更重要是定义接口,让服务端和客户端能分离出来


推荐阅读

(点击标题可跳转阅读)

ASP.NET Core gRPC使用 Consul 服务注册发现

ASP.NET Core 3.0 gRPC身份认证和授权

ASP.NET Core 3.0 gRPC双向流 


看完本文有收获?请转发分享给更多人

关注「DotNet」加星标,提升.Net技能 

好文章,我在看❤️

: . Video Mini Program Like ,轻点两下取消赞 Wow ,轻点两下取消在看

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存